package com.tgy.helloworld.AOP;

import com.tgy.helloworld.annotation.CropBelongToSysName;
import com.tgy.helloworld.entity.Entity;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import java.lang.reflect.Method;
import java.util.List;

/***
 * @ClassName: SysAOP
 * @Description:
 * @Auther: tanggy3
 * @Date: 12:08 2022/11/28
 * @version : V1.0
 */
@Aspect//标注这个类是一个切面
@Component //注册到spring中管理
public class SysAOP {


//    @Pointcut("@annotation(com.tgy.helloworld.annotation.CropBelongToSysName)")
//    public void test() {}

    //在环绕增强中，我们可以给定一个参数，代表我们要获取处理的切入点56876876
    @Around("@annotation(com.tgy.helloworld.annotation.CropBelongToSysName)")
    public void around(ProceedingJoinPoint jp) throws Throwable {
        MethodSignature signature = (MethodSignature) jp.getSignature();
        Method method = signature.getMethod();
        CropBelongToSysName cropBelongToSysName = method.getAnnotation(CropBelongToSysName.class);
        System.out.println("cropBelongToSysName是===>"+cropBelongToSysName.value());

        List<Entity> arg = (List<Entity>)jp.getArgs()[0];
        arg.forEach((bean)->{
            String name = bean.getName();
            if (!StringUtils.isEmpty(name) &&name.matches(".*\\/*")){
                bean.setName(name.split("/")[0]);
                bean.setAge(9999);
            }
        });
        //arg.remove(0);

        Object [] aaa = {arg};

        System.out.println("==============");
        System.out.println("获取参数"+arg.toString());
        Object proceed = jp.proceed(aaa);
        System.out.println("==============");

    }


    /**
     * 这里表示在这个包下的所有方法并且没有@PushData 这个注解才会生效
     */
/*
    @Pointcut("execution(* com.XX.XXService.*(..)) && !@annotation(com.XX.PushData)")
    public void deal(){
        log.info("进入切面");
    }

    @Around("deal()")
    public Object around1(ProceedingJoinPoint jp) throws Throwable {
        log.info("开始");
        //获取原来方法对应的入参
        FlwHandleTaskDTO fBean = (FlwHandleTaskDTO) jp.getArgs()[0];
        */
/**
         * 这一步是为了执行原来的方法，并返回
         *//*

        Object [] aaa = {fBean};
        Object proceed = jp.proceed(aaa);

        log.info("数据为===》{}",JSON.toJSONString(pmi));
        log.info("结束");
        return proceed;//需要返回
    }
*/




}



























